package com.chnjan.ccblog.pub.random;

import java.security.SecureRandom;
import java.text.SimpleDateFormat;
import java.util.Date;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.util.StringUtils;

/**
 * @author chenjian
 * 生成唯一id
 *
 */
public class IdGenerate {
	
	private static final Logger LOGGER = LoggerFactory.getLogger(IdGenerate.class);
	
	private static final SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmssSSS");
	/**
	 * 获取唯一的id
	 * 由时间戳+6位随机码组成 23位的字符串
	 * @return String
	 * */
	public static String generateId() {
		//唯一id
		String uniqueId = "";
		
		//获取6位随机码
		String randomCode = getRandomCode(6);
		
		//结果
		uniqueId = getCurrntTimeNum() + randomCode;
		LOGGER.debug("生成id："+uniqueId);
		return uniqueId ;
	}
	
	
	/**
	 * 获取唯一的id
	 * 由时间戳+2位类别id+6位随机码组成 25位的字符串
	 * @param moduleid 功能模块id两位长度的字符串
	 * @return String 输入模块id长度不符合返回空字符串
	 * */
	public static String generateId(String moduleid) {
		
		if (StringUtils.isEmpty(moduleid)) {
			return "";
		}
		
		if (moduleid.length() != 2) {
			return "";
		}
		//唯一id
		String uniqueId = "";
		
		//获取6位随机码
		String randomCode = getRandomCode(6);
		
		//结果
		uniqueId = getCurrntTimeNum() + moduleid + randomCode;
		LOGGER.debug("生成包含模块的id："+uniqueId);
		return uniqueId ;
	}
	
	
	/**
	 * 获取指定位数的随机码
	 * @param count 随机码的位数
	 * @return String 随机码
	 * 
	 * */
	public static String getRandomCode(int count) {
		if (count<=0) {
			return "";
		}
		
		String randomCode = "";
		StringBuilder sb = new StringBuilder("");
		
		//获取随机对象单例
		SecureRandom random = SingletonRandom.getInstance();
		LOGGER.debug("随机算法："+random.getAlgorithm());
		//随机字符的范围
		String numRange = "1235689074";

		//拼接指定长度的字符
		for (int i = 0; i < count; i++) {
			int charIndex = random.nextInt(10);
			sb.append(numRange.charAt(charIndex));
		}
		
		randomCode = sb.toString();
		return randomCode ;
	}
	
	/**
	 * 获取当前时间戳
	 * @return String 当前时间戳，如20180107014552559
	 * */
	public static String getCurrntTimeNum() {
		return sdf.format(new Date());
	}

}
